package main

import (
	"fmt"
	"time"
)

func writeData(chanInt chan int) {
	for i := 0; i < 10; i += 2 {
		chanInt <- i
		time.Sleep(time.Second)
	}
	close(chanInt)
}

func readData(chanInt chan int, isOver chan bool) {
	for v := range chanInt {
		fmt.Println(v)
	}
	isOver <- true
	close(isOver)
}

func main() {
	chanInt := make(chan int, 20)
	isOver := make(chan bool, 1)
	chanInt <- 5
	fmt.Println(len(chanInt), cap(chanInt))
	// num1 := <-chanInt
	// fmt.Println(num1)
	//go readData(chanInt)
	go writeData(chanInt)
	//读取数据时阻塞，需要阻塞在主线程，如果另起一个协程，主线程没有阻塞会直接结束
	//也可以读取都用协程，创建一个是否读取完成的管道，主线程阻塞这个辅助协程
	go readData(chanInt, isOver)
	count := 0
label:
	for {
		select {
		case v := <-chanInt:
			fmt.Println("成功从chanint读取一个数据为:", v)
		case v := <-isOver:
			fmt.Println("终于从isOver读取到数据为:", v, "gameOver")
			break label
		case <-time.After(time.Second):
			fmt.Println("timed out")
			// default:
			// 	fmt.Println("there is default")
		}
		count++
	}
	//for循环了6次,所以select是等待case结果返回，不是直接结束开始下一次循环
	fmt.Println(count)
}

//select结合time.After函数可以判断协程是否超时，下面的例子表示超过5分钟后，返回timed out
// select {
// case m := <-c:
//     handle(m)
// case <-time.After(5 * time.Minute):
//     fmt.Println("timed out")
// }
